package Other;

import java.lang.reflect.Method;
import java.util.Scanner;

public class Demo1 {
    public static void main1(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Scanner scanner = new Scanner(System.in);

        String className = scanner.nextLine();

        // 实例化这个类的一个对象
        // 利用反射完成
        Class<?> aClass = Class.forName(className);

        // 使用反射方法，实例化一个对象（调用无参构造方法）
        Object o = aClass.newInstance();

        // o 引用指向的对象，就是用户输入的这个类实例化出来的对象
        System.out.println(o);
    }

    public static void main2(String[] args) throws ClassNotFoundException {
        Class<?> c1 = Class.forName("java.lang.String");
        Class<?> c2 = Class.forName("java.lang.String");
        Class<?> c3 = Class.forName("java.lang.String");
        Class<?> c4 = Class.forName("java.lang.String");

        // 断言: c1 == c2 == c3 == c4 （同一性）
        // 运行期间，一个类只会有一个 RTTI，发生在类加载之后 >>>>>运行时类型(RTTI)
    }

    public static void main3(String[] args) throws Exception {
        Class<?> c = Class.forName("com.peixinchen.乱七八糟.Person");
        Method print = c.getMethod("print");
        // print 代表是一个方法的 RTTI

        Object o = c.newInstance();
        // 通过 o 这个对象（Person 类型）调用 print 方法
        print.invoke(o);
    }

    public static void main(String[] args) throws Exception {
        Class c1 = Class.forName("com.peixinchen.乱七八糟.Person");
        Class c2 = Person.class;

        Person p = new Person();
        Class c3 = p.getClass();

        System.out.println(c1 == c2);
        System.out.println(c2 == c3);
    }
}
